/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package krawedzie;

import gra.TVisualisation;
import ste.TAbstBlock;
import java.awt.Color;
import java.util.ArrayList;
import javax.swing.*;
import javax.vecmath.Vector3d;
import nor.TPoint;
import out.*;
import powierzchnie.Powierzchnie;
import powierzchnie1.Powierzchnie1Main;

/**
 *
 * @author mignat
 */
public class TWykrKraw extends TAbstBlock {
    
    private ArrayList<TPoint[]> fPtTAL = new ArrayList<TPoint[]>();
    //zmienna potrzebna do przekazania dalej wynikow prac z klasy TNormalne
    //bo klasa TWykrKraw nie kozysta z nich.
    private ArrayList<TPoint[]> dlaPowierzchniPtTAL ;
    
    public String getTabTitle() {
        return "Wykrywanie krawedzi pionowych";
    }

    public JComponent getJComponent() { 
        JPanel jp = new JPanel();
        jp.setBackground(Color.MAGENTA);
        jp.add(getObjP());
        return jp;   
    } //koniec getJComponent

    public void setNext(TAbstBlock aNext) {
         theNext = aNext;
    }

    public void checkSettings() {
    } //koniec checkSettings

    public void showGraphic() {
        TVisualisation _lVis = new TVisualisation(); //do grafiki
        //Zapisuję wszystko w jednej tablicy
        ArrayList<TPoint> lPtAL = new ArrayList<TPoint>();
        for (TPoint[] ptT : fPtTAL) //biorę kolejne tablice
            for (TPoint pt : ptT) //biorę kolejne elty z tablicy
                lPtAL.add(pt);
        
        _lVis.addPtNorT(lPtAL.toArray(new TPoint[lPtAL.size()]));
        _lVis.display();
    } //koniec showGraphic

    public void clear() {
        
    } //koniec clear

    public void starter(IOut o) {
        //Wszystko obrabiam w klasie finish
    } //koniec starter
    
    //Do przekazania całej tablicy punktów (bo nie korzystam ze startera)
    public void setPtTAL(ArrayList<TPoint[]> aPtTAL) {
        //ustawienie tego co przyszlo z TNormalne
        this.dlaPowierzchniPtTAL = aPtTAL;
        //Kopia dla tej klasy.
        for (TPoint[] ptT : aPtTAL) {//przepisuje pkt po pkcie
            TPoint[] lPtT = new TPoint[ptT.length];
            for (int i=0; i<lPtT.length; i++) 
                lPtT[i] = new TPoint(ptT[i]);
            fPtTAL.add(lPtT);
        } //koniec for ptT
        
    } //koniec setPtTAL
    
    public void finish() {
        
        //1. Kasuje kolory pktów
        for (TPoint[] ptT : fPtTAL)
            for (TPoint pt : ptT)
                pt.setColor(Color.WHITE);
        
        //2. Licze cosinus kata pomiedzy normalnymi sasiednich pktow
        for (TPoint[] ptT : fPtTAL) { //skan w pionie
//System.out.println ("PION");
            for (int i=1; i<ptT.length-1; i++) { //skan w poziomie (pomijam skrajne)
//System.out.println ("for i: " + i + ", ptT.l: " + ptT.length);
                //3. Biorę normalne sasiadow
                Vector3d vP = ptT[i-1].getNorVec();
                Vector3d vN = ptT[i+1].getNorVec();
//System.out.println ("vP: " + (vP==null ? "NULLLL" : vP));
//System.out.println ("vN: " + (vN==null ? "NULLLL" : vN));
                if (vP!= null && vP.x != Double.NaN && vP.y != Double.NaN && 
                                                        vP.z != Double.NaN && 
                    vN!= null && vN.x != Double.NaN && vN.y != Double.NaN && 
                                                        vN.z != Double.NaN) {
                                        
                    double cosAlfa = vP.x*vN.x + vP.y*vN.y + vP.z*vN.z;
//System.out.println ("cosAlfa: " + cosAlfa);
                    if (cosAlfa < 0.1) { //jeżeli bliske zeru, to krawedz
                        ptT[i].setColor(Color.RED);
                    } //koniec if
                } //koniec if
            } //koniec for i
        } //koniec for ptT
        
        //
        //przekazujemy do wykrywania powierzchni
        //
        if(theNext instanceof Powierzchnie1Main)
            System.out.println("OK!");
        
        ////((Powierzchnie)theNext).setPtTAL(this.dlaPowierzchniPtTAL);
        ((Powierzchnie1Main)theNext).setPtTAL(this.dlaPowierzchniPtTAL);
       theNext.finish();
        
    } //koniec finish
} //koniec klasy TWykrKraw
